package br.com.hs.nfe.common.app;

import br.com.hs.nfe.common.to.BaseTO;
import br.com.hs.nfe.common.enumeration.EnumItf;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Classe de contexto do aplicativo.
 * @author Ranlive Hrysyk
 */
public final class AppContext {

    private static AppContext appContext = null;
    private Map<EnumItf, BaseTO> map = new HashMap();

    /**
     * Obtém a instância da classe.
     */
    public static synchronized AppContext getInstance() {
        if (appContext == null) {
            appContext = new AppContext();
        }
        return appContext;
    }

    /**
     * Destrói a instância da classe.
     */
    public static void destroyInstance() {
        appContext = null;
    }

    /**
     * Adiciona um valor a lista.
     */
    public synchronized void setTO(EnumItf appContexEnum, BaseTO baseTO) {
        map.put(appContexEnum, baseTO);
    }

    /**
     * Obtém um valor da lista.
     */
    public <T extends BaseTO> T getTO(EnumItf appContexEnum, Class<T> t) {
        BaseTO to = null;
        try {
            to = (BaseTO) map.get(appContexEnum);
            if (to != null) {
                to = (BaseTO) to.clone();
            }
        } catch (CloneNotSupportedException e) {
            Logger.getLogger(AppContext.class.getName()).log(Level.SEVERE, null, e);
        }
        return (T) to;
    }
}
